package flyweighgt_pattern.ex1;

import java.util.EnumMap;
import java.util.Map;

/**
 * 享元模式的工厂类，用于创建和管理药水对象。
 * 该类确保不会创建重复的药水实例，从而节省内存。
 * 实现了单例模式，通过 `getInstance` 方法获取唯一实例。
 *
 * @author 申书航
 * @version 1.0
 */
public class PotionFactory {

    /** 存储已创建的药水对象的映射 */
    private final Map<PotionType, Potion> potions;

    /** 单一实例 */
    private static PotionFactory instance = new PotionFactory();

    /** 私有构造函数，初始化药水映射 */
    private PotionFactory() {
        potions = new EnumMap<>(PotionType.class);
    }

    /**
     * 获取PotionFactory的唯一实例
     * @return PotionFactory的实例
     */
    public static PotionFactory getInstance() {
        return instance;
    }

    /**
     * 根据药水类型获取药水实例
     * 如果药水实例尚未创建，则会新建该药水实例并存入映射中。
     *
     * @param type 药水类型
     * @return 对应类型的药水实例
     */
    public Potion getPotion(PotionType type) {
        // 获取已经创建的药水实例
        Potion potion = potions.get(type);
        // 如果不存在，则创建新的药水实例
        if (potion == null) {
            switch (type) {
                case HEALING:
                    potion = new HealingPotion();
                    break;
                case STRONG:
                    potion = new StrongPotion();
                    break;
                case INVISIBILITY:
                    potion = new InvisibilityPotion();
                    break;
                case HOLLY_WATER:
                    potion = new HollyWaterPotion();
                    break;
                default:
                    break;
            }
            // 将新创建的药水实例存入映射中
            potions.put(type, potion);
        }
        return potion; // 返回药水实例
    }
}
